home *** CD-ROM | disk | FTP | other *** search
/ RISC User... in a Nutshell / RISC User... in a Nutshell.iso / !Nutshell / !OvnPro / Applets / !Mines / Library / Mines
Encoding:
Text File  |  1997-05-15  |  6.4 KB  |  367 lines

  1. // Version 1.00 05/12/97  First release as an applet.
  2. // This is also my FIRST applet EVER in this language.
  3. // By Daniel Barron @ Beebug Computers Ltd
  4. // Copyright Risc User May 1997
  5.  
  6. int mines_handle;
  7. int mines_toolbox = 0;
  8. int mines_total = 0;
  9. int mines_mem = 0;
  10. int mines_views = 0;
  11. int mines_centre = 1;
  12. string mines_boxes;
  13. int mines_iamalive = 1;
  14. int mines_c1 = 1664525;
  15. int mines_c2 = 907633393;
  16. int mines_seed;
  17. int mines_numberofthem = 10;
  18. int mines_numbercorrect;
  19. int mines_numberblanks;
  20. int mines_flagsdone;
  21. int mines_emptysquaresdone;
  22.  
  23.  
  24. int mines_rnd(void)
  25. {
  26.  int w1;
  27.  int w2;
  28.  mines_seed = mines_c1 * mines_seed + mines_c2;
  29.  w1 = mines_c1 * mines_seed + mines_c2;
  30.  mines_seed = w1;
  31.  w1 = w1 & 0xFFFF;
  32.  w2 = mines_seed & 0x0000FFFF;
  33.  w1 = w1 << 16;
  34.  w2 = w2 >> 16;
  35.  w1 = w1 | w2;
  36.  mines_seed = mines_seed ^ w1;
  37.  w1 = mines_seed & 255;
  38.  if (w1 < 0)
  39.   w1 = 0 - w1;
  40.  return(w1);
  41. }
  42.  
  43.  
  44. void mines_updatesquare(int x, int y, string letter,int add)
  45. {
  46.  int icon;
  47.  mines_emptysquaresdone = mines_emptysquaresdone + add;
  48.  icon = 2 + x + y *10;
  49.  writeicon(mines_handle, icon, letter);
  50. }
  51.  
  52.  
  53. string mines_getsquare(int x, int y)
  54. {
  55.  string result;
  56.  int offset;
  57.  offset=2 + x + y * 10;
  58.  result=readicon(mines_handle, offset);
  59.  return(result);
  60. }
  61.  
  62.  
  63. int mines_noofmines(int x, int y)
  64. {
  65.  int offset;
  66.  int mine;
  67.  int value;
  68.  if (x < 0)
  69.   return(0);
  70.  if (y < 0)
  71.   return(0);
  72.  if (x > 9)
  73.   return(0);
  74.  if (y > 9)
  75.   return(0);
  76.  offset=x + y * 10;
  77.  mine = schar(mines_boxes, offset);
  78.  value = 0;
  79.  if (mine == 33)
  80.   value = 1;
  81.  return(value);
  82. }
  83.  
  84.  
  85. void mines_placeaflag(int x,int y)
  86. {
  87.  if (mines_getsquare(x,y) == "@")
  88.  {
  89.   mines_updatesquare(x,y,"*",0);
  90.   mines_flagsdone --;
  91.   if (mines_noofmines(x,y) == 1)
  92.    mines_numbercorrect --;
  93.  }
  94.  else
  95.  {
  96.   if (mines_getsquare(x,y) == "*")
  97.   {
  98.    if(mines_flagsdone > 9)
  99.     return();
  100.    mines_updatesquare(x,y,"@",0);
  101.    mines_flagsdone ++;
  102.    if (mines_noofmines(x,y) == 1)
  103.    mines_numbercorrect ++;
  104.   }
  105.  }
  106. }
  107.  
  108.  
  109. void mines_dodie(void)
  110. {
  111.  int x;
  112.  int y;
  113.  int square;
  114.  for ( x=0; x<10 ; x++)
  115.  {
  116.   for ( y=0; y<10 ; y++)
  117.   {
  118.   square = mines_noofmines(x,y);
  119.   if( square == 1)
  120.   mines_updatesquare(x,y,"#",0);
  121.   }
  122.  }
  123.  mines_iamalive = 0;
  124.  writeicon(mines_handle, 102, "Bye Bye Dodo");
  125. }
  126.  
  127.  
  128. void mines_dowin(void)
  129. {
  130.  mines_iamalive = 0;
  131.  writeicon(mines_handle, 102, "Woopy Do Dar!");
  132. }
  133.  
  134.  
  135. void mines_footflag(void)
  136. {
  137.  string whatitis;
  138.  whatitis = readicon(mines_handle, 102);
  139.  if (whatitis == "Foot")
  140.   writeicon(mines_handle, 102, "Flag");
  141.  else
  142.   writeicon(mines_handle, 102, "Foot");
  143. }
  144.  
  145.  
  146. void mines_checkmines(int x,int y)
  147. {
  148.  int mines = 0;
  149.  string letter;
  150.  if (x < 0)
  151.   return();
  152.  if (y < 0)
  153.   return();
  154.  if (x > 9)
  155.   return();
  156.  if (y > 9)
  157.   return();
  158.  mines += mines_noofmines(x-1,y-1);
  159.  mines += mines_noofmines(x,y-1);
  160.  mines += mines_noofmines(x+1,y-1);
  161.  mines += mines_noofmines(x-1,y);
  162.  mines += mines_noofmines(x+1,y);
  163.  mines += mines_noofmines(x-1,y+1);
  164.  mines += mines_noofmines(x,y+1);
  165.  mines += mines_noofmines(x+1,y+1);
  166.  if (mines_getsquare(x,y) == "*")
  167.  {
  168.   switch (mines)
  169.   {
  170.    case 0:
  171.     mines_updatesquare(x,y," ",1);
  172.     mines_checkmines(x-1,y-1);
  173.     mines_checkmines(x,y-1);
  174.     mines_checkmines(x+1,y-1);
  175.     mines_checkmines(x-1,y);
  176.     mines_checkmines(x+1,y);
  177.     mines_checkmines(x-1,y+1);
  178.     mines_checkmines(x,y+1);
  179.     mines_checkmines(x+1,y+1);
  180.     break;
  181.    case 1:mines_updatesquare(x,y,"1",1);
  182.     break;
  183.    case 2:mines_updatesquare(x,y,"2",1);
  184.     break;
  185.    case 3:mines_updatesquare(x,y,"3",1);
  186.     break;
  187.    case 4:mines_updatesquare(x,y,"4",1);
  188.     break;
  189.    case 5:mines_updatesquare(x,y,"5",1);
  190.     break;
  191.    case 6:mines_updatesquare(x,y,"6",1);
  192.     break;
  193.    case 7:mines_updatesquare(x,y,"7",1);
  194.     break;
  195.    case 8:mines_updatesquare(x,y,"8",1);
  196.     break;
  197.   }
  198.  }
  199. }
  200.  
  201.  
  202. void mines_clickonmine(int icon)
  203. {
  204.  int square;
  205.  int x;
  206.  int y;
  207.  y = icon - 2;
  208.  y = y / 10;
  209.  x= icon - 2 - y * 10;
  210.  if (readicon(mines_handle, 102) == "Flag")
  211.   mines_placeaflag(x,y);
  212.  else
  213.  {
  214.   mines_checkmines(x,y);
  215.   square = mines_noofmines(x,y);
  216.   if( square == 1)
  217.    mines_dodie();
  218.  }
  219.  if(mines_numbercorrect == mines_numberofthem)
  220.  {
  221.   if(mines_emptysquaresdone == mines_numberblanks)
  222.   {
  223.    if(mines_flagsdone == mines_numberofthem)
  224.    {
  225.     mines_dowin();
  226.    }
  227.   }
  228.  }
  229. }
  230.  
  231.  
  232. void mines_alterstring(string letter, int pos)
  233. {
  234.  string temp1;
  235.  string temp2;
  236.  string s;
  237.  s = mines_boxes;
  238.  temp1 = mids(s, 0, pos);
  239.  temp2 = mids(s, pos+1, slen(s)-(pos+1));
  240.  mines_boxes = temp1 + letter + temp2;
  241. }
  242.  
  243.  
  244. void mines_laymines(void)
  245. {
  246.  int n=0;
  247.  int num;
  248.  mines_boxes = "                                                                                                    ";
  249.  while (n < mines_numberofthem)
  250.  {
  251.   do num=mines_rnd()/2;
  252.   while (num>99);
  253.   if (mids(mines_boxes,num,1)==" ");
  254.   {
  255.    n++;
  256.    mines_alterstring("!", num);
  257.   }
  258.  }
  259. }
  260.  
  261.  
  262. void mines_restart(void)
  263. {
  264.  int n;
  265.  mines_iamalive = 1;
  266.  mines_numbercorrect = 0;
  267.  mines_numberblanks = 100 - mines_numberofthem;
  268.  mines_flagsdone = 0;
  269.  mines_emptysquaresdone = 0;
  270.  writeicon(mines_handle, 102, "Foot");
  271.  for (n = 2; n < 102; n++)
  272.  {
  273.   writeicon(mines_handle, n, "*");
  274.  }
  275.  mines_seed = (clock() * 4267) & 0xffffffff;
  276.  mines_laymines();
  277. }
  278.  
  279.  
  280. void mines_display(void)
  281. {
  282.  display_window(mines_handle, 0, mines_centre);
  283.  mines_centre = 0;
  284.  
  285.  
  286. int mines_entry(int entry,int subcode)
  287. {
  288.  mines_toolbox = !mines_toolbox;
  289.  if(mines_toolbox)
  290.   mines_display();
  291.  else
  292.   close_window(mines_handle);
  293.  return(0);
  294. }
  295.  
  296.  
  297. int mines_flags(int entry, string &text)
  298. {
  299.  return(mines_toolbox);
  300. }
  301.  
  302.  
  303. void mines_clicktoolbox(int handle,int icon,int bits,int mx,int my)
  304. {
  305.  if (mines_iamalive==1)
  306.  {
  307.   if(icon > 1 )
  308.   {
  309.    if(icon < 102 )
  310.    mines_clickonmine(icon);
  311.   }
  312.   if(icon == 1)
  313.   mines_footflag();
  314.  }
  315.  if(icon == 0)
  316.  mines_restart();
  317. }
  318.  
  319.  
  320. void mines_closetoolbox(int handle)
  321. {
  322.  close_window(handle);
  323.  mines_toolbox = 0;
  324. }
  325.  
  326.  
  327. void mines_viewopen(int user, int view)
  328. {
  329.  ++mines_views;
  330. }
  331.  
  332.  
  333. void mines_viewclose(int user, int view)
  334. {
  335.  --mines_views;
  336.  if(!mines_views)
  337.   close_window(mines_handle);
  338. }
  339.  
  340.  
  341. void mines_gaincaret(int user, int view, int gain)
  342. {
  343.  if(gain && mines_toolbox && mines_views == 1)
  344.   mines_display();
  345. }
  346.  
  347.  
  348. void main(void)
  349. {
  350.  int n;
  351.  int test;
  352.  int square;
  353.  script_menu_initialise(); 
  354.  addentry_menu(script_handle, "mines_entry","mines_flags","","","{Mines}");
  355.  mines_handle = create_window("mines_main");
  356.  addwindowhandler(0,mines_handle,"mines_clicktoolbox");
  357.  addwindowhandler(2,mines_handle,"mines_closetoolbox");
  358.  addeventhandler(0x005, 0, "mines_viewopen");
  359.  addeventhandler(0x006, 0, "mines_viewclose");
  360.  for(n = 1; n < 100; ++n);
  361.  {
  362.   test = schar(mines_boxes, n);
  363.  }
  364.  mines_restart();
  365. }
  366.